/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package interfacesGraficas;

import DTOs.DTOCliente;
import Fabricas.FabricaExpertos;
import entidadesNegocio.Cliente;


import entidadesNegocio.Localidad;
import entidadesNegocio.Zona;
import excepciones.ExpertoClienteExcepcion;
import interfacesGraficas.ModeloTablas.ModeloTablaCliente;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JInternalFrame;
import expertos.ExpertoABMClientes;
import interfacesGraficas.ModeloCombo.ModeloComboLocalidad;
import interfacesGraficas.ModeloCombo.ModeloComboZona;
import java.util.List;
import javax.swing.JOptionPane;

/**
 *
 * @author eduardo
 */
public class ControladorABMClientes extends Controlador {

    private PantallaABMClientes pantallaABM;
    private PantallaActualizarCliente pantallaActualiza;
    private ExpertoABMClientes expertoABM;
    private ModeloTablaCliente modeloTablaCliente;
    private Cliente clienteSeleccionado;
    private Zona nuevaZona;
    private Localidad nuevaLocalidad;
    private List<Localidad> localidadesEncontradas;
    private ModeloComboLocalidad modeloComboLocalidad;
    private ModeloComboLocalidad modComboLocalActualizada;
    private ModeloComboZona modeloComboZona;
    private PantallaNuevaZona pantallaNuevaZona;
    private PantallaNuevaLocalidad pantallaNuevaLocalidad;

    public ControladorABMClientes() {
        pantallaABM = new PantallaABMClientes();
        pantallaActualiza = new PantallaActualizarCliente();
        pantallaNuevaZona = new PantallaNuevaZona();
        pantallaNuevaLocalidad = new PantallaNuevaLocalidad();
        expertoABM = (ExpertoABMClientes) FabricaExpertos.getInstancia().getExperto(FabricaExpertos.expertos.CLIENTES);
        modeloTablaCliente = new ModeloTablaCliente();
        pantallaABM.getTablaClientes().setModel(modeloTablaCliente);
        modeloComboLocalidad = new ModeloComboLocalidad();
        modeloComboZona = new ModeloComboZona();

        //PantallaABMCLiente
        pantallaABM.getTablaClientes().addMouseListener(new MouseAdapter() {

            @Override
            public void mouseClicked(MouseEvent e) {
                int fila = pantallaABM.getTablaClientes().rowAtPoint(e.getPoint());
                clienteSeleccionado = modeloTablaCliente.buscarCliente(pantallaABM.getTablaClientes().getValueAt(fila, 1).toString());

                if (e.getClickCount() == 2) {
                    try {
                        actualizarCliente();

                    } catch (ExpertoClienteExcepcion ex) {
                        Logger.getLogger(ControladorABMClientes.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            }
        });



        pantallaABM.getBotonnuevocliente().addActionListener(new ActionListener() {

            String nombreLocalidad = null;
            Long oidlocalidad = null;

            public void actionPerformed(ActionEvent ae) {
                pantallaABM.getNroCliente().setEnabled(true);
                pantallaABM.getNombreCliente().setEnabled(true);
                pantallaABM.getCelular().setEnabled(true);
                pantallaABM.getDireccion().setEnabled(true);
                pantallaABM.getEmail().setEnabled(true);
                pantallaABM.getTelefono().setEnabled(true);
                pantallaABM.getGuardarCliente().setEnabled(true);
                pantallaABM.getCombolocalidad().setEnabled(true);
                //modeloComboLocalidad.setListaCombo(buscarLocalidad());


            }
        });

        pantallaABM.getBotonsalir().addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent ae) {
                limpiarPantallaABM();
                pantallaABM.setVisible(false);
            }
        });

        pantallaABM.getGuardarCliente().addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent ae) {
                guardarCliente();
            }
        });

        pantallaABM.getRadioBtnCodigo().addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent ae) {
                if (pantallaABM.getRadioBtnCodigo().isSelected()) {
                    pantallaABM.getCampobuscacodigo().setEnabled(true);
                    pantallaABM.getCampoBuscaNombreCliente().setEnabled(false);
                }
            }
        });

        pantallaABM.getRadioBtnNombre().addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent ae) {
                if (pantallaABM.getRadioBtnNombre().isSelected()) {
                    pantallaABM.getCampoBuscaNombreCliente().setEnabled(true);
                    pantallaABM.getCampobuscacodigo().setEnabled(false);
                }
            }
        });
        pantallaABM.getCampoBuscaNombreCliente().addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent ae) {
                try {
                    buscarCliente();
                } catch (ExpertoClienteExcepcion ex) {
                    Logger.getLogger(ControladorABMClientes.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        });

        pantallaABM.getCampobuscacodigo().addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent ae) {
                try {
                    buscarCliente();
                } catch (ExpertoClienteExcepcion ex) {
                    Logger.getLogger(ControladorABMClientes.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        });

        pantallaABM.getBotonbuscaClientes().addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent ae) {
                try {
                    buscarCliente();
                } catch (ExpertoClienteExcepcion ex) {
                    JOptionPane.showMessageDialog(pantallaABM, ex.getMessage(), "INFORMACION", JOptionPane.INFORMATION_MESSAGE);
                }
            }
        });


        pantallaABM.getBotoneliminar().addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent ae) {
                eliminarCliente();
            }
        });

        pantallaABM.getBotonactualizar().addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent ae) {


                try {
                    actualizarCliente();
                } catch (ExpertoClienteExcepcion ex) {
                    Logger.getLogger(ControladorABMClientes.class.getName()).log(Level.SEVERE, null, ex);
                }

            }
        });

        pantallaABM.getBotonNuevaLocalidad().addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent ae) {
                nuevaLocalidad();
            }
        });

        pantallaABM.getBotonNuevaZona().addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent ae) {
                nuevaZona();
            }
        });

//PantallaActualizarCliente
        pantallaActualiza.getBtnconfirmacliente().addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent ae) {
                guardarClienteActualizado();
            }
        });

//pantallaNuevaZona

        pantallaNuevaZona.getBotonGuardarZona().addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent ae) {
                guardarZona();
            }
        });

        pantallaNuevaZona.getBotonSalirZona().addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent ae) {
                pantallaNuevaZona.setVisible(false);
            }
        });

//pantallaNuevaLocalidad

        pantallaNuevaLocalidad.getBotonGuardarLocalidad().addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent ae) {
                guardarLocalidad();
            }
        });

        pantallaNuevaLocalidad.getBotonSalirLocalidad().addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent ae) {
                pantallaNuevaLocalidad.setVisible(false);
                
            }
        });

    }

    public void limpiarPantallaABM() {
        if (!modeloTablaCliente.getListaElementos().isEmpty()) {
            modeloTablaCliente.clear();
        }
        pantallaABM.getCampoBuscaNombreCliente().setText("");
        pantallaABM.getCampobuscacodigo().setText("");
        pantallaABM.getNroCliente().setText("");
        pantallaABM.getNombreCliente().setText("");
        pantallaABM.getDireccion().setText("");
        pantallaABM.getEmail().setText("");
        pantallaABM.getTelefono().setText("");
        pantallaABM.getCelular().setText("");
        pantallaABM.getCampobuscacodigo().setEnabled(true);
        pantallaABM.getCampoBuscaNombreCliente().setEnabled(false);
        pantallaABM.getNroCliente().setEnabled(false);
        pantallaABM.getNombreCliente().setEnabled(false);
        pantallaABM.getDireccion().setEnabled(false);
        pantallaABM.getEmail().setEnabled(false);
        pantallaABM.getTelefono().setEnabled(false);
        pantallaABM.getCelular().setEnabled(false);
        pantallaABM.getCombolocalidad().setEnabled(false);
        pantallaABM.getGuardarCliente().setEnabled(false);

    }

    public void limpiarPantallaActualizarCliente() {
        pantallaActualiza.getNrocliente().setText("");
        pantallaActualiza.getNombrecliente().setText("");
        pantallaActualiza.getDireccioncliente().setText("");
        pantallaActualiza.getTelefonocliente().setText("");
        pantallaActualiza.getCelularcliente().setText("");
        pantallaActualiza.getEmailcliente().setText("");

    }

    public List<Localidad> buscarLocalidad() {

        List<Localidad> localidades = null;
        localidades = expertoABM.buscarLocalidad();

        return localidades;
    }

    public void guardarCliente() {
        if (clienteSeleccionado == null) {
            clienteSeleccionado = new Cliente();

        }

        clienteSeleccionado.setCodigoCliente(pantallaABM.getNroCliente().getText());
        clienteSeleccionado.setCelularCliente(pantallaABM.getCelular().getText());
        clienteSeleccionado.setDireccionCliente(pantallaABM.getDireccion().getText());
        clienteSeleccionado.setEmailCliente(pantallaABM.getEmail().getText());
        clienteSeleccionado.setNombreCliente(pantallaABM.getNombreCliente().getText());
        clienteSeleccionado.setTelefonoCliente(pantallaABM.getTelefono().getText());
        clienteSeleccionado.setLocalidad(((ModeloComboLocalidad) pantallaABM.getCombolocalidad().getModel()).getLocalidadSeleccionado());
        clienteSeleccionado.setEliminado(Boolean.FALSE);

        try {
            expertoABM.guardar(clienteSeleccionado);

            limpiarPantallaABM();
            modeloTablaCliente.addRow(clienteSeleccionado);
            clienteSeleccionado = null;
            JOptionPane.showMessageDialog(pantallaABM, "Cliente Guardado Correctamente", "Información", JOptionPane.INFORMATION_MESSAGE);

        } catch (ExpertoClienteExcepcion ex) {
            JOptionPane.showMessageDialog(pantallaABM, ex.getMessage(), "ATENCIÓN", JOptionPane.WARNING_MESSAGE);
        }


    }

    public void guardarClienteActualizado() {
        if (clienteSeleccionado == null) {
            return;

        }
        clienteSeleccionado.setCodigoCliente(pantallaActualiza.getNrocliente().getText());
        clienteSeleccionado.setNombreCliente(pantallaActualiza.getNombrecliente().getText());
        clienteSeleccionado.setDireccionCliente(pantallaActualiza.getDireccioncliente().getText());
        clienteSeleccionado.setTelefonoCliente(pantallaActualiza.getTelefonocliente().getText());
        clienteSeleccionado.setCelularCliente(pantallaActualiza.getCelularcliente().getText());
        clienteSeleccionado.setEmailCliente(pantallaActualiza.getEmailcliente().getText());
        clienteSeleccionado.setLocalidad(null);
        clienteSeleccionado.setLocalidad(((ModeloComboLocalidad) pantallaActualiza.getComboLocalidadActualizada().getModel()).getLocalidadSeleccionado());

        try {
            expertoABM.guardar(clienteSeleccionado);
            limpiarPantallaActualizarCliente();
            pantallaActualiza.setVisible(false);
            modeloTablaCliente.fireTableDataChanged();
            clienteSeleccionado = null;

        JOptionPane.showMessageDialog(pantallaABM, "Cliente Actualizado Correctamente", "Información", JOptionPane.INFORMATION_MESSAGE);

        } catch (ExpertoClienteExcepcion ex) {
            Logger.getLogger(ControladorABMClientes.class.getName()).log(Level.SEVERE, null, ex);
                             
        }
        
        
    }

    public void actualizarCliente() throws ExpertoClienteExcepcion {
        if (clienteSeleccionado != null) {

            cargarPantallaActualizaCliente();
        } else {
            JOptionPane.showMessageDialog(pantallaABM, "Debe seleccionar un Cliente", "INFORMACIÓN", JOptionPane.INFORMATION_MESSAGE);
        }
    }

    public void eliminarCliente() {
        if (clienteSeleccionado != null) {
            int seleccion = JOptionPane.showOptionDialog(null,
                    "Está seguro que desea eliminar cliente \nCódigo: " + clienteSeleccionado.getCodigoCliente() + ". Nombre: " + clienteSeleccionado.getNombreCliente(),
                    "ELIMINAR CLIENTE",
                    JOptionPane.YES_NO_OPTION,
                    JOptionPane.QUESTION_MESSAGE,
                    null, // null para icono por defecto.
                    new Object[]{"Aceptar", "Cancelar"}, // null para YES, NO y CANCEL
                    "Cancelar");
            if (seleccion == 0) {
                try {
                    expertoABM.eliminar(clienteSeleccionado);
                    JOptionPane.showMessageDialog(pantallaABM, "Cliente Eliminado Correctamente", "INFORMACIÓN", JOptionPane.INFORMATION_MESSAGE);
                    modeloTablaCliente.quitarClienteLista(clienteSeleccionado);
                    pantallaABM.getCampoBuscaNombreCliente().setText("");
                    pantallaABM.getCampobuscacodigo().setText("");
                    
                } catch (ExpertoClienteExcepcion ex) {
                    JOptionPane.showMessageDialog(pantallaABM, ex.getMessage(), "ERROR", JOptionPane.ERROR_MESSAGE);
                }


            }
        } else {
            JOptionPane.showMessageDialog(pantallaABM, "Debe seleccionar un Cliente", "INFORMACIÓN", JOptionPane.INFORMATION_MESSAGE);
        }

    }

    public void cargarPantallaActualizaCliente() {
        String nombreLocalidad;
        pantallaActualiza.setVisible(true);
        pantallaActualiza.getNrocliente().setText(clienteSeleccionado.getCodigoCliente());
        pantallaActualiza.getNombrecliente().setText(clienteSeleccionado.getNombreCliente());
        pantallaActualiza.getDireccioncliente().setText(clienteSeleccionado.getDireccionCliente());
        pantallaActualiza.getTelefonocliente().setText(clienteSeleccionado.getTelefonoCliente());
        pantallaActualiza.getCelularcliente().setText(clienteSeleccionado.getCelularCliente());
        pantallaActualiza.getEmailcliente().setText(clienteSeleccionado.getEmailCliente());
        pantallaActualiza.getComboLocalidadActualizada().setSelectedItem(clienteSeleccionado.getLocalidad().getNombreLocalidad());




    }

    public void buscarCliente() throws ExpertoClienteExcepcion {


        if (!modeloTablaCliente.getListaElementos().isEmpty()) {
            modeloTablaCliente.clear();
        }

        if (pantallaABM.getRadioBtnCodigo().isSelected()) {

            modeloTablaCliente.addAllRow(expertoABM.buscarClientes(armarDTOCliente(1)));

        } else if (pantallaABM.getRadioBtnNombre().isSelected()) {

            modeloTablaCliente.addAllRow(expertoABM.buscarClientes(armarDTOCliente(2)));
        }

    }

    public void nuevaLocalidad(){
        limpiarPantallaNuevaLocalidad();
        pantallaNuevaLocalidad.getComboBoxZona().setModel(modeloComboZona);
        pantallaNuevaLocalidad.setVisible(true);
        pantallaNuevaLocalidad.setLocationRelativeTo(null);
        
    }

    public void nuevaZona(){
        limpiarPantallaNuevaZona();
        pantallaNuevaZona.setVisible(true);
        pantallaNuevaZona.setLocationRelativeTo(null);

    }

    public void limpiarPantallaNuevaZona(){
        pantallaNuevaZona.getCampoCodigoZona().setText("");
        pantallaNuevaZona.getCampoNombreZona().setText("");

    }

    public void limpiarPantallaNuevaLocalidad(){
        pantallaNuevaLocalidad.getCampoCodigoLocalidad().setText("");
        pantallaNuevaLocalidad.getCampoNombreLocalidad().setText("");
        pantallaNuevaLocalidad.getCampoProvincia().setText("");
        
    }

    public void guardarZona() {

        if (nuevaZona == null) {
            nuevaZona = new Zona();
        }

        nuevaZona.setCodigozona(pantallaNuevaZona.getCampoCodigoZona().getText());
        nuevaZona.setNombrezona(pantallaNuevaZona.getCampoNombreZona().getText());
        nuevaZona.setEliminado(Boolean.FALSE);
        try {
            expertoABM.guardar(nuevaZona);
            JOptionPane.showMessageDialog(pantallaABM, "Zona Guardada Correctamente", "Información", JOptionPane.INFORMATION_MESSAGE);
            modeloComboZona.addElement(nuevaZona.getNombrezona());
            limpiarPantallaNuevaZona();
            pantallaNuevaZona.setVisible(false);
            nuevaZona = null;

            
        } catch (ExpertoClienteExcepcion ex) {
            Logger.getLogger(ControladorABMClientes.class.getName()).log(Level.SEVERE, null, ex);
        }
        
    }

    public void guardarLocalidad(){
        if(nuevaLocalidad == null){
            nuevaLocalidad = new Localidad();
        }

        nuevaLocalidad.setCodigoLocalidad(pantallaNuevaLocalidad.getCampoCodigoLocalidad().getText());
        nuevaLocalidad.setNombreLocalidad(pantallaNuevaLocalidad.getCampoNombreLocalidad().getText());
        nuevaLocalidad.setProvincia(pantallaNuevaLocalidad.getCampoProvincia().getText());
        nuevaLocalidad.setZona(((ModeloComboZona) pantallaNuevaLocalidad.getComboBoxZona().getModel()).getZonaSeleccionado());
        nuevaLocalidad.setEliminado(Boolean.FALSE);
        try {
            expertoABM.guardarLocalidad(nuevaLocalidad);
            JOptionPane.showMessageDialog(pantallaABM, "Localidad Guardada Correctamente", "Información", JOptionPane.INFORMATION_MESSAGE);
            modeloComboLocalidad.addElement(nuevaLocalidad.getNombreLocalidad());
            limpiarPantallaNuevaLocalidad();
            pantallaNuevaLocalidad.setVisible(false);
            nuevaLocalidad = null;

        } catch (ExpertoClienteExcepcion ex) {
            Logger.getLogger(ControladorABMClientes.class.getName()).log(Level.SEVERE, null, ex);
        }
        
    }

    public DTOCliente armarDTOCliente(Integer caso) {

        DTOCliente nuevoDto = new DTOCliente();

        switch (caso) {
            case 1:

                if (!pantallaABM.getCampobuscacodigo().getText().equals("")) {
                    nuevoDto.setNrocliente(pantallaABM.getCampobuscacodigo().getText());
                } else {
                    nuevoDto = null;
                }

                break;
            case 2:

                if (!pantallaABM.getCampoBuscaNombreCliente().getText().equals("")) {
                    nuevoDto.setNombreCliente(pantallaABM.getCampoBuscaNombreCliente().getText());
                } else {
                    nuevoDto = null;
                }
                break;
        }
        return nuevoDto;
    }

    @Override
    public void iniciar() {

        pantallaABM.setVisible(true);
        modeloComboLocalidad = new ModeloComboLocalidad(expertoABM.buscarLocalidad());
        modComboLocalActualizada = new ModeloComboLocalidad(modeloComboLocalidad);
        modeloComboZona = new ModeloComboZona(expertoABM.buscarZona());
        pantallaABM.getCombolocalidad().setModel(modeloComboLocalidad);
        pantallaActualiza.getComboLocalidadActualizada().setModel(modComboLocalActualizada);
        

    }

    @Override
    public void finalizar() {
        pantallaABM.setVisible(false);
    }

    @Override
    public void continuar() {
        pantallaABM.setVisible(true);
    }

    @Override
    public JInternalFrame getPantalla() {

        return pantallaABM;


    }
}
